#include <iostream>
#include <typeinfo>
#include <time.h>
#include "Stack.h"

using namespace std;

int main()
{
	// 如何给c取别名？
	// 权限的平移
	int a = 10;
	int& b = a;
	const int c = 20;

	// 打印对象的类型
	// 在vs中，包含了iostream、展开了std之后可以直接使用，vsc中需要包含
	cout << typeid(a).name() << endl;
	cout << typeid(b).name() << endl;

	// 权限的放大。c可读而不可写，直接int& d是可读可写的，故不能这样使用
	// 权限不能放大，只能平移或缩小
	//int& d = c;		// 权限的放大
	const int& d = c;	// 权限的平移

	// 权限的缩小
	int e = 30;
	const int& f = e;

	int ii = 1;
	double dd = ii;			// ii的值可以赋给dd
	// double& rdd = ii;	// double不能作为int的引用
	const double& rdd = ii;	// 如何解释？
	// 类型不一样时，会发送类型提升或者截断，会产生一个double的临时变量（ii先转成double再赋值）
	// rdd不能引用的原因不在于类型不匹配，rdd引用的不是ii，而是临时变量，而临时变量是double的
	// 临时变量具有常性（相当于被const修饰了）
	// 不能引用的本质原因是权限的放大，加了const之后就不会出现权限的放大了
	// 强制类型转化、隐式类型转化都会出现临时变量（操作数类型不一样时会出现类型转换）

	return 0;
}